const db = uniCloud.database();
const dbCmd = db.command;
const { result, snakeToCamel } = require('product-api-utils');
const timing = require('product-api-timing');
let dbJQL;

module.exports = {
	_timing: function (params) {
		// 定时任务执行
		if (params.TriggerName === 'reset_wallpaper_select_trigger') {
			const currentHour = new Date().getHours();
			// 当天00:00:00执行
			if (currentHour === 0) {
				// timing.resetWallpaperSelect();
			}
			// 当天02:00:00执行
			else if (currentHour === 2) {
				// timing.randomWallpaperSelect();
			}
			// 当天04:00:00执行
			else if (currentHour === 4) {
				timing.computedSystemScore();
			}
		}
	},

	_before: function () {
		// 通用预处理器
		this.startTime = Date.now();
		this.params = {};
		const httpInfo = this.getHttpInfo();

		if (httpInfo) {
			const body = httpInfo.body;
			if (!body) throw result(400, 'required', 'body不能为空！');
			this.params = JSON.parse(body);
		}

		dbJQL = uniCloud.databaseForJQL({
			clientInfo: this.getClientInfo()
		});
		dbJQL.setUser({
			uid: '680c9977af3a3cca857ec1b9', // uni-id-users表
			role: ['admin'] // uni-id-roles表
		});
	},

	// 获取轮播图列表
	getBannerList: async function () {
		const res = await dbJQL.collection('product_wallpaper_banner').field('title,picurl.url as url,target').get({ getCount: true });

		return result(0, 'success', res.data, res.count);
	},

	// 获取分类列表
	getClassList: async function () {
		const { pageSize = 8, pageNum = 1, select } = this.params;
		const conditon = { enable: true };
		if (select) {
			conditon.select = true;
		}
		const res = await dbJQL
			.collection('product_wallpaper_class')
			.where(conditon)
			.field('classname,picurl.url as url,sort,enable,select,update_time as updateTime')
			.orderBy('sort', 'asc')
			.skip((pageNum - 1) * pageSize)
			.limit(pageSize)
			.get({ getCount: true });

		return result(0, 'success', res.data, res.count);
	},

	// 获取图片列表
	getWallList: async function () {
		const { classId, pageSize = 10, pageNum = 1, select, keyword } = this.params;

		if (!classId && !keyword) {
			return result(400, 'required', 'classId 和 keyword 不能同时为空！');
		}

		// 构建查询条件
		let matchCondition = {
			del_status: false
		};
		if (select) {
			matchCondition.select = true;
		}
		if (keyword) {
			const regex = new RegExp(keyword, 'i');
			matchCondition.$or = [{ name: regex }, { nickname: regex }, { tabs: regex }];
		} else {
			matchCondition.class_id = classId;
		}

		// 统计总数量
		const totalRes = await db.collection('product_wallpaper_list').aggregate().match(matchCondition).count('total').end();
		const count = totalRes.data.length > 0 ? totalRes.data[0].total : 0;

		// 获取分页数据
		const res = await db
			.collection('product_wallpaper_list')
			.aggregate()
			// 筛选符合条件的数据
			.match(matchCondition)
			// 按更新时间降序排序
			.sort({ update_time: -1 })
			// 分页处理
			.skip((pageNum - 1) * pageSize)
			.limit(pageSize)
			// 聚合连接分类表
			.lookup({
				from: 'product_wallpaper_class',
				localField: 'class_id',
				foreignField: '_id',
				as: 'classInfo'
			})
			.unwind('$classInfo')
			// 聚合连接用户表
			.lookup({
				from: 'uni-id-users',
				localField: 'user_id',
				foreignField: '_id',
				as: 'userInfo'
			})
			.unwind('$userInfo')
			// 添加 project 阶段进行字段筛选和重命名
			.project({
				_id: 1, // 图片id
				name: 1, // 图片名称
				nickname: 1, // 图片昵称
				description: 1, // 图片描述
				tabs: 1, // 图片标签
				score: 1, //图片系统评分
				sort: 1, // 图片排序
				viewCount: '$view_count', // 图片浏览量
				select: 1, // 图片是否推荐
				updateTime: '$update_time', //图片创建时间
				url: '$picurl.url', // 图片地址
				userId: '$userInfo._id', // 图片发布人id
				username: '$userInfo.username', // 图片发布人姓名
				classId: '$classInfo._id', // 图片分类id
				classname: '$classInfo.classname' // 图片分类名称
			})
			.end();

		return result(0, 'success', res.data, count);
	},

	// 查询每日推荐列表
	randomWall: async function () {
		// 联表聚合查询
		// 查询图片表product_wallpaper_list，获取推荐（select: true）且系统评分（score）从高到低排序的数据
		// product_wallpaper_list.class_id外键关联product_wallpaper_class._id
		// product_wallpaper_list.user_id外键关联uni-id-users_class._id

		const res = await db
			.collection('product_wallpaper_list')
			.aggregate()
			// 筛选出推荐的图片数据
			.match({ select: true })
			// 随机选取 10 张图片
			.sample({ size: 10 })
			// 聚合连接分类表
			.lookup({
				from: 'product_wallpaper_class',
				localField: 'class_id',
				foreignField: '_id',
				as: 'classInfo'
			})
			.unwind('$classInfo')
			// 过滤掉分类表中禁用的数据
			.match({ 'classInfo.enable': true })
			// 聚合连接用户表
			.lookup({
				from: 'uni-id-users',
				localField: 'user_id',
				foreignField: '_id',
				as: 'userInfo'
			})
			.unwind('$userInfo')
			// 添加 project 阶段进行字段筛选和重命名
			.project({
				_id: 1, // 图片id
				name: 1, // 图片名称
				nickname: 1, // 图片昵称
				description: 1, // 图片描述
				tabs: 1, // 图片标签
				score: 1, //图片系统评分
				sort: 1, // 图片排序
				viewCount: '$view_count', // 图片浏览量
				select: 1, // 图片是否推荐
				updateTime: '$update_time', //图片创建时间
				url: '$picurl.url', // 图片地址
				userId: '$userInfo._id', // 图片发布人id
				username: '$userInfo.username', // 图片发布人姓名
				classId: '$classInfo._id', // 图片分类id
				classname: '$classInfo.classname' // 图片分类名称
			})
			.end();

		return result(0, 'success', res.data, res.data.length);
	},

	// 获取图片详情
	detailWall: async function () {
		const { id } = this.params;
		if (!id) {
			return result(400, 'required', 'id不能为空！');
		}

		const res = await db
			.collection('product_wallpaper_list')
			.aggregate()
			.match({
				_id: id
			})
			.lookup({
				from: 'product_wallpaper_class',
				localField: 'class_id',
				foreignField: '_id',
				as: 'classInfo'
			})
			.unwind('$classInfo')
			.lookup({
				from: 'uni-id-users',
				localField: 'user_id',
				foreignField: '_id',
				as: 'userInfo'
			})
			.unwind('$userInfo')
			// 添加 project 阶段进行字段筛选和重命名
			.project({
				_id: 1, // 图片id
				name: 1, // 图片名称
				nickname: 1, // 图片昵称
				description: 1, // 图片描述
				tabs: 1, // 图片标签
				score: 1, //图片系统评分
				sort: 1, // 图片排序
				viewCount: '$view_count', // 图片浏览量
				select: 1, // 图片是否推荐
				updateTime: '$update_time', //图片创建时间
				url: '$picurl.url', // 图片地址
				userId: '$userInfo._id', // 图片发布人id
				username: '$userInfo.username', // 图片发布人姓名
				classId: '$classInfo._id', // 图片分类id
				classname: '$classInfo.classname' // 图片分类名称
			})
			.end();

		return result(0, 'success', res.data, res.data.length);
	},

	// 用户评分
	setWallScore: async function () {
		const { id, score, userId } = this.params;
		if (!id || !score || !userId) {
			return result(400, 'required', 'id、score、userId不能为空！');
		}

		// 先判断 id 和 userId 对应的数据是否存在，存在则更新 score，不存在才新增
		const queryRes = await db
			.collection('product_wallpaper_score')
			.where({
				wallpaper_id: id,
				score_user: userId
			})
			.get();

		let res;
		if (queryRes.data.length > 0) {
			res = await db
				.collection('product_wallpaper_score')
				.where({
					wallpaper_id: id,
					score_user: userId
				})
				.update({
					user_score: score
				});
		} else {
			res = await db.collection('product_wallpaper_score').add({
				wallpaper_id: id,
				user_score: score,
				score_user: userId,
				has_statistic: false,
				create_time: new Date().getTime()
			});
		}
		return result(0, 'updateSuccess', res);
	},

	// 记录图片下载信息
	downloadWall: async function () {
		const { id, userId } = this.params;
		if (!id || !userId) {
			return result(400, 'required', 'id、userId不能为空！');
		}

		// 先判断 id 和 userId 对应的数据是否存在，不存在才新增
		const queryRes = await db
			.collection('product_wallpaper_download')
			.where({
				wallpaper_id: id,
				download_user: userId
			})
			.get();

		let res;
		if (queryRes.data.length === 0) {
			res = await db.collection('product_wallpaper_download').add({
				wallpaper_id: id,
				download_user: userId,
				create_time: new Date().getTime()
			});
		}
		return result(0, 'updateSuccess', res);
	},

	// 统计用户的评分/下载总数
	staticHistoryCount: async function () {
		const { type, userId } = this.params;
		if (!type || !userId) {
			return result(400, 'required', 'type、userId不能为空！');
		}

		let dbTable;
		let typeField;

		// 根据 type 确定查询的表和字段
		if (type === 'score') {
			dbTable = 'product_wallpaper_score';
			typeField = 'score_user';
		} else if (type === 'download') {
			dbTable = 'product_wallpaper_download';
			typeField = 'download_user';
		} else {
			return result(400, 'required', 'type 参数值无效！');
		}

		const res = await db
			.collection(dbTable)
			.aggregate()
			.match({
				[typeField]: userId
			})
			.count('total')
			.end();

		const count = res.data.length > 0 ? res.data[0].total : 0;

		return result(0, 'success', res.data, count);
	},

	// 查询我的评分/我的下载列表
	getHistoryWallList: async function () {
		const { type, userId, pageSize = 10, pageNum = 1 } = this.params;
		if (!type || !userId) {
			return result(400, 'required', 'type、userId不能为空！');
		}

		let dbTable;
		let typeField;

		// 根据 type 确定查询的表和字段
		if (type === 'score') {
			dbTable = 'product_wallpaper_score';
			typeField = 'score_user';
		} else if (type === 'download') {
			dbTable = 'product_wallpaper_download';
			typeField = 'download_user';
		} else {
			return result(400, 'required', 'type 参数值无效！');
		}

		// 联表聚合查询
		// product_wallpaper_score.wallpaper_id外键关联product_wallpaper_list._id
		// product_wallpaper_score.score_user外键关联uni-id-users_class._id
		// product_wallpaper_download.wallpaper_id外键关联product_wallpaper_list._id
		// product_wallpaper_download.download_user外键关联uni-id-users_class._id
		// product_wallpaper_list.class_id外键关联product_wallpaper_class._id
		// product_wallpaper_list.user_id外键关联uni-id-users_class._id

		// 统计总数量
		const totalRes = await db
			.collection(dbTable)
			.aggregate()
			.match({
				[typeField]: userId
			})
			.count('total')
			.end();
		const count = totalRes.data.length > 0 ? totalRes.data[0].total : 0;

		// 获取分页数据
		const res = await db
			.collection(dbTable)
			.aggregate()
			.match({
				[typeField]: userId
			})
			// 分页处理
			.skip((pageNum - 1) * pageSize)
			.limit(pageSize)
			.lookup({
				from: 'product_wallpaper_list',
				localField: 'wallpaper_id',
				foreignField: '_id',
				as: 'wallpaperInfo'
			})
			.unwind('$wallpaperInfo')
			.lookup({
				from: 'product_wallpaper_class',
				localField: 'wallpaperInfo.class_id',
				foreignField: '_id',
				as: 'classInfo'
			})
			.unwind('$classInfo')
			.lookup({
				from: 'uni-id-users',
				localField: 'wallpaperInfo.user_id',
				foreignField: '_id',
				as: 'userInfo'
			})
			.unwind('$userInfo')
			.lookup({
				from: 'uni-id-users',
				localField: typeField,
				foreignField: '_id',
				as: 'operatorInfo'
			})
			.unwind('$operatorInfo')
			// 添加 project 阶段进行字段筛选和重命名
			.project({
				_id: 0,
				wallpaper_id: 0,
				[snakeToCamel(typeField)]: 1, // 图片评分人（下载人）
				[`${snakeToCamel(typeField)}name`]: '$operatorInfo.username', // 图片评分人（下载人）姓名
				userScore: '$user_score', // 图片评分分数
				userId: '$userInfo._id', // 图片发布人id
				username: '$userInfo.username', // 图片发布人姓名
				classId: '$classInfo._id', // 图片分类id
				classname: '$classInfo.classname', // 图片分类名称
				_id: '$wallpaperInfo._id', // 图片id
				name: '$wallpaperInfo.name', // 图片名称
				nickname: '$wallpaperInfo.nickname', // 图片昵称
				description: '$wallpaperInfo.description', // 图片描述
				tabs: '$wallpaperInfo.tabs', // 图片标签
				score: '$wallpaperInfo.score', //图片系统评分
				sort: '$wallpaperInfo.sort', // 图片排序
				viewCount: '$wallpaperInfo.view_count', // 图片浏览量
				select: '$wallpaperInfo.select', // 图片是否推荐
				updateTime: '$wallpaperInfo.update_time', //图片创建时间
				url: '$wallpaperInfo.picurl.url' // 图片地址
			})
			.end();

		return result(0, 'success', res.data, count);
	},

	// 批量删除图片
	deleteWall: async function () {
		const { ids } = this.params;
		if (!ids || !ids.length) {
			return result(400, 'required', 'ids不能为空！');
		}
		const res = await db
			.collection('product_wallpaper_list')
			.where({
				_id: dbCmd.in(ids)
			})
			.remove();
		if (res.deleted === 0) {
			return result(404, 'notFound');
		}
		return result(0, 'deleteSuccess', res.deleted);
	},

	// 批量删除云存储中的文件
	deleteFile: async function (clientParams) {
		const { fileIds } = clientParams ?? this.params;
		if (!fileIds || !fileIds.length) {
			return result(400, 'required', 'fileIds不能为空！');
		}
		const res = await uniCloud.deleteFile({
			fileList: fileIds
		});
		return result(
			0,
			'deleteSuccess',
			res.fileList?.map((item) => item.fileID)
		);
	},

	// 获取用户位置信息
	getUserInfo: async function () {
		const { clientIP } = this.getClientInfo();
		// 调用第三方接口解析IP地址
		const res = await uniCloud.request({
			url: 'https://whois.pconline.com.cn/ipJson.jsp?json=true&ip=' + clientIP,
			method: 'GET',
			timeout: 2000
		});
		return result(0, 'success', res.data);
	},

	_after: function (error, result) {
		if (error) {
			throw error;
		}
		result.timeCost = Date.now() - this.startTime;
		result.author = '接口提供者：明致成';
		return result;
	}
};
